package com;

import java.util.LinkedList;

/**
 * 链表 : 链表中保存节点,节点中有三个元素,自身对象(添加的元素),下一个节点的地址,上一个节点的地址
 * 
 * LinkedList 就是基于双向链表实现的
 * 
 * 链表是没有下标的,所以查询慢,当然我们可以通过 get() 方法 , 使用下标找到数据
 * 
 * 但是get() 方法中,也是通过循环,从首结点一步步向后找的,不像 ArrayList,底层是数组,有下标,可以直接数组[下标],可以参考源码
 * 
 * @author lenovo
 * @Date 2020年7月16日
 * @Time 下午9:00:37
 */
public class Collection_07_LinkedList {

	public static void main(String[] args) {
		LinkedList li = new LinkedList();
		// 尾部添加 成功返回true
		li.add(1);

		// 头部添加
		li.push(7);

		// 头部添加
		li.addFirst(2);

		// 尾部添加
		li.addLast(3);

		// 头部添加,成功返回true
		li.offerFirst(4);

		// 尾部添加,成功返回true
		li.offerLast(5);

		// 尾部添加,成功返回true
		li.offer(6);

		// 上面几个方法 , 本质调用的就是两个方法, linkLast和linkFirst 所以没有任何区别,主要为了解决大家的命名习惯问题
		// 4271356
		System.out.println(li);

		// 获取指定下标对应的元素
		System.out.println(li.get(2));
		System.out.println("--");
		// 获取首位元素
		System.out.println(li.getFirst());

		// 获取最后一个元素
		System.out.println(li.getLast());

		// 获取首位元素,并删除该元素,如果没有首位元素(就是集合中元素个数为0 ) 返回null
		System.out.println(li.poll());

		// 获取首位元素,并删除该元素,如果没有首位元素(就是集合中元素个数为0 ) ,报错
		// java.util.NoSuchElementException
		System.out.println(li.pop());

		for (Object object : li) {
			System.out.println(object);
		}
	}

}
